/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package main;

import connections.Query;
import java.applet.AudioClip;
import javax.swing.JApplet;
import javax.swing.JPanel;
import model.User;
import serverComm.CommConnection;
import view.KlassenBeheerPagina;
import view.Lobby;
import view.MultiSpelPagina;
import view.ProfilePage;

/**
 *
 * @author Jeroen
 */
public class ApplicatieMain extends JApplet {

    // App
    private static ApplicatieMain instance;
    private static int max_niveau = 10;
    private static int min_niveau = 1;
    // Settings
    private int maxPoging = 10;
    // Spel Info
    private String username = null;
    private int gewonnen = 0;
    private int verloren = 0;
    private int gewonnenMulti = 0;
    private int verlorenMulti = 0;
    private int geraden = 0;
    private int woordNiveau = 0;
    private int userNiveau = 50;
    private int score = 0;
    private String galgjeWoord = null; // Het woord dat geraden moet worden.
    private char gebruikteLetters[] = new char[26]; // Gebruikte letters
    private String hintWoord = null;
    private boolean playing = false;
    private MultiSpelPagina multiSpel;
    private Query query;
    private Lobby lobby;
    private int nieuwSpelPlayer = 0;
    private int nieuwSpelOpponent = 0;
    private int brinNummer;
    private boolean serverRunning = false;
    private boolean notifyLobbyUpdate = false;
    private CommConnection commServer;
    private User requestedOpponent;
    private KlassenBeheerPagina klasBeheer;
    private int selectedWoordenlijst = 0;
    // Leraar
    private int selectedKlasID;
    private ProfilePage profielPagina;



    @Override
    public void init() {

        instance = this;
        query = new Query();
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                showPage(new view.HoofdPagina());

            }
        });
    }

    @Override
    public void stop() {
    }

    @Override
    public void destroy() {
        query.setStatus(0); //set user as logged out/offline
        if (isServerRunning()) {
            commServer.getCommOut().setStatus(1); // Spel Verlaten
            commServer.disconnectServer();
        }
    }

    public static ApplicatieMain getInstance() {
        return instance;
    }

    public void showPage(JPanel panel) {
        getContentPane().removeAll();
        setContentPane(panel);
        validate();
        repaint();
    }

    public void playSound(String location) {
        AudioClip clip = getAudioClip(getDocumentBase(), "classes/sounds/"+location+".au");
        clip.play();
        System.out.println("Playing sound: "+ location +".au from: "+ getDocumentBase());
    }

    public void woordHint(String woord) {
        int wordID = query.getWordID(woord, this.getSelectedWoordenlijst());
        String uitleg = query.getWordExplanation(wordID, this.getSelectedWoordenlijst());
        setHintWoord(uitleg);
        System.out.println("Hint: " + uitleg);
    }

    public void woordDifficulty(String woord) {
        int wordID = query.getWordID(woord, this.getSelectedWoordenlijst());
        int niveau = query.getWordDifficulty(wordID, this.getSelectedWoordenlijst());
        setDifficulty(niveau);
    }

//    public void userDifficulty(String username) {
//        int userID = query.getUserID(username);
//        userNiveau = query.getUserDifficulty(userID);
//        setUserNiveau(userNiveau);
//        updateUserDifficulty(username);
//        System.out.println("Je zit op niveau (main): " + userNiveau);
//    }
    /**
     * Deze functie verandert het niveau in de database en vervangt hem in de applicatie
     * @param username
     */
    public void updateUserDifficulty(String username) {
        query.setUserDifficulty(userNiveau, query.getUserID(username));
        requestUserDifficulty(username);
    }

    /*
     * Deze functie haalt het niveau uit de database en verandert hem in de applicatie
     * @param username
     */
    public void requestUserDifficulty(String username) {
        setUserNiveau(query.getUserDifficulty(query.getUserID(username)));
    }

    public void requestGewonnen(String username) {
        setGewonnen(query.getUserWon(query.getUserID(username)));
    }

    public void updateGewonnen(String username) {
        query.setUserWon(gewonnen, query.getUserID(username));
        requestGewonnen(username);
    }

    public void requestVerloren(String username) {
        setGewonnen(query.getUserLost(query.getUserID(username)));
    }

    public void updateVerloren(String username) {
        query.setUserLost(gewonnen, query.getUserID(username));
        requestVerloren(username);
    }

    public void requestGewonnenMulti(String username) {
        setGewonnenMulti(query.getUserWonMulti(query.getUserID(username)));
    }

    public void updateGewonnenMulti(String username) {
        query.setUserWonMulti(gewonnen, query.getUserID(username));
        requestGewonnen(username);
    }

    public void requestVerlorenMulti(String username) {
        setVerlorenMulti(query.getUserLost(query.getUserID(username)));
    }

    public void updateVerlorenMulti(String username) {
        query.setUserLostMulti(gewonnen, query.getUserID(username));
        requestVerloren(username);
    }

    public int getUserNiveau() {
        return userNiveau;
    }

    public void setUserNiveau(int userNiveau) {
        this.userNiveau = userNiveau;
    }

    public void userScore(String username) {
        int userID = query.getUserID(username);
        score = query.getUserScore(userID);
        setScore(score);
    }

    public void updateScore(int newScore) {
        query.setUserScore(newScore, query.getUserID(getUsername()));
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public void setDifficulty(int niveau) {
        this.woordNiveau = niveau;
    }

    public int getDifficulty() {
        return woordNiveau;
    }

    public Query getQuery() {
        return query;
    }

    public MultiSpelPagina getMultiSpel() {
        return multiSpel;
    }

    public void setMultiSpel(MultiSpelPagina multiSpel) {
        this.multiSpel = multiSpel;
    }

    public String getHintWoord() {
        return hintWoord;
    }

    public void setHintWoord(String hintWoord) {
        this.hintWoord = hintWoord;
    }

    public CommConnection getCommServer() {
        return commServer;
    }

    public void setCommServer(CommConnection server) {
        this.commServer = server;
    }

    public String getUsername() {
        return this.username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getGalgjeWoord() {
        return this.galgjeWoord;
    }

    public void setGalgjeWoord(String galgjeWoord) {
        this.galgjeWoord = galgjeWoord;
    }

    public char[] getGebruikteLetters() {
        return gebruikteLetters;
    }

    public void setGebruikteLetters(char[] gebruikteLetters) {
        this.gebruikteLetters = gebruikteLetters;
    }

    public int getMaxPoging() {
        return maxPoging;
    }

    public boolean isPlaying() {
        return playing;
    }

    public void setPlaying(boolean playing) {
        this.playing = playing;
    }

    public int getGewonnen() {
        return gewonnen;
    }

    public void setGewonnen(int gewonnen) {
        this.gewonnen = gewonnen;
    }

    public int getVerloren() {
        return verloren;
    }

    public void setVerloren(int verloren) {
        this.verloren = verloren;
    }

    public int getGeraden() {
        return geraden;
    }

    public void setGeraden(int geraden) {
        this.geraden = geraden;
    }

    public void setLobby(Lobby lobby) {
        this.lobby = lobby;
    }

    public Lobby getLobby() {
        return this.lobby;
    }

    public int getNieuwSpelOpponent() {
        return nieuwSpelOpponent;
    }

    public int getBrinNummer() {
        return this.brinNummer;
    }

    public void setNieuwSpelOpponent(int nieuwSpelOpponent) {
        this.nieuwSpelOpponent = nieuwSpelOpponent;
    }

    public void setBrinNummer(int brinNummer) {
        this.brinNummer = brinNummer;
    }

    public int getNieuwSpelPlayer() {
        return nieuwSpelPlayer;
    }

    public void setNieuwSpelPlayer(int nieuwSpelPlayer) {
        this.nieuwSpelPlayer = nieuwSpelPlayer;
    }

    public boolean isServerRunning() {
        return serverRunning;
    }

    public void setServerRunning(boolean serverRunning) {
        this.serverRunning = serverRunning;
    }

    public int getSelectedKlasID() {
        return selectedKlasID;
    }

    public void setSelectedKlasID(int selectedKlasID) {
        this.selectedKlasID = selectedKlasID;
    }

    public int getMax_niveau() {
        return max_niveau;
    }

    public int getMin_niveau() {
        return min_niveau;
    }

    public boolean getNotifyLobbyUpdate() {
        return notifyLobbyUpdate;
    }

    public void setNotifyLobbyUpdate(boolean notifyLobbyUpdate) {
        this.notifyLobbyUpdate = notifyLobbyUpdate;
    }

    public void setRequestedOpponent(User requestedOpponent) {
        this.requestedOpponent = requestedOpponent;
    }

    public User getRequestedOpponent() {
        return requestedOpponent;
    }

    public int getSelectedWoordenlijst() {
        return selectedWoordenlijst;
    }

    public void setSelectedWoordenlijst(int selectedWoordenlijst) {
        this.selectedWoordenlijst = selectedWoordenlijst;
    }

    public int getGewonnenMulti() {
        return gewonnenMulti;
    }

    public void setGewonnenMulti(int gewonnenMulti) {
        this.gewonnenMulti = gewonnenMulti;
    }

    public int getVerlorenMulti() {
        return verlorenMulti;
    }

    public void setVerlorenMulti(int verlorenMulti) {
        this.verlorenMulti = verlorenMulti;
    }

    public int getWoordNiveau() {
        return woordNiveau;
    }

    public void setWoordNiveau(int woordNiveau) {
        this.woordNiveau = woordNiveau;
    }

    public KlassenBeheerPagina getKlasBeheer() {
        return klasBeheer;
    }

    public void setKlasBeheer(KlassenBeheerPagina klasBeheer) {
        this.klasBeheer = klasBeheer;
    }

    public ProfilePage getProfielPagina() {
        return profielPagina;
    }

    public void setProfielPagina(ProfilePage profielPagina) {
        this.profielPagina = profielPagina;
    }


}
